
package com.travelsmart.client.apresentacao.view;

import java.util.List;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.travelsmart.client.apresentacao.controller.CommandController;
import com.travelsmart.client.apresentacao.controller.Observer;

import com.travelsmart.client.apresentacao.widget.FormBarraNavegacao;
import com.travelsmart.client.apresentacao.widget.FormDate;
import com.travelsmart.client.bean.to.ReservaHotelTO;
/**
 * 
 * @author arthur
 *
 */
public class ViewListaReservaHotel extends BaseView implements
		Observer<List<ReservaHotelTO>> {

	private VerticalPanel panelBase = new VerticalPanel();
	private Grid grid = new Grid();
	private List<ReservaHotelTO> reservas;
	private FormBarraNavegacao barraNavegacao;

	private int linhaSelecionada;
	private CommandController<Long> handlerShowReserva;
	// configura o nro de registros mostrado por pagina
	private static final int nroRegistrosPagina = 4;
	private static final String[] nomesColunas = new String[] { "", "Hotel",
			"Data Entrada", "Data Saída", "Data da Reserva" };

	public ViewListaReservaHotel(final CommandController<Integer> handlerShowPage,
			final CommandController<Long> handlerShowReserva) {
		super(new HTML());
		this.handlerShowReserva = handlerShowReserva;
		// configura a barra de navegacao
		this.barraNavegacao = new FormBarraNavegacao(handlerShowPage);
		this.grid.addClickHandler(new ClickHandler() {
			/*
			 * Trata os eventos de cliques na tabela
			 */
			@Override
			public void onClick(ClickEvent event) {
				Cell cellE = grid.getCellForEvent(event);
				int row = cellE.getRowIndex();
				int cell = cellE.getCellIndex();
				// retornar se clique for no cabecalho
				if (row != 0) {
					// define o css da linha selecionada
					marcarLinha(row);
					// se clicado na primeira coluna, mostra o DialogBox
					if (cell == 0) {
						mostraDialogBox(row);
					}
				}
			}
		});
		// inicializa a tabela com linhas e colunas
		iniciaTabela(nomesColunas);
		// configura o layout da tabela
		configuraGridLayout();
		// configura o Composite com o DockPanel
		initWidget(panelBase);
	}

	public void exec(List<ReservaHotelTO> reservas) {
		//# INICIO - EXERC. 1
		panelBase.clear();
		//adiciona a barra de navegacao e o grid ao panel
		panelBase.add(grid);
		panelBase.add(barraNavegacao);
		if(reservas.size() == 0){
			barraNavegacao.isUltimaPagina(true);
			return;
		}
		this.reservas = reservas;
		int nroColunas = grid.getColumnCount();
		// inicia na segunda linha para nao sobrescrever o cabecalho
		int linha = 1;
		for(int i = 0; i < reservas.size(); i++, linha++){
			ReservaHotelTO reserva = (ReservaHotelTO) reservas.get(i);
			
			
			grid.setHTML(linha, 0, "<img id='reserva_"+ linha +"' src='imagens/ico-up.gif' />");
			grid.setWidget(linha, 1, new Label(reserva.getHotel().getNome()));
			grid.setWidget(linha, 2, new Label(FormDate.dateFormat.format(reserva.getDataEntrada())));
			grid.setWidget(linha, 3, new Label(FormDate.dateFormat.format(reserva.getDataSaida())));
			grid.setWidget(linha, 4, new Label(FormDate.dateFormat.format(reserva.getData())));
			grid.getRowFormatter().setStyleName(linha, "travelsmart-table-linha");
		}
		// se for a ultima pagina limpa o restante das linhas
		boolean ultimaPagina = false;
		for(;linha < nroRegistrosPagina + 1; ++linha){
			ultimaPagina = true;
			for(int coluna = 0; coluna < nroColunas; coluna++){
				grid.clearCell(linha, coluna);
				grid.getRowFormatter().setStyleName(linha, "travelsmart-table-linha");
			}
			
		}
		barraNavegacao.isUltimaPagina(ultimaPagina);
		//FIM - EXERC. 1 #*/
	}

	private void mostraDialogBox(int row) {
		// seleciona a reserva da lista de reserva da pagina
		ReservaHotelTO reserva = getReserva(row);
		//
		handlerShowReserva.handleSuccess(reserva.getId());
	}

	private void configuraGridLayout() {
		grid.setStyleName("travelsmart-table");
		grid.setCellSpacing(0);
		grid.setCellPadding(2);
		grid.getRowFormatter().setStyleName(0, "travelsmart-tableHeader");
		grid.setWidth("700");
		grid.getCellFormatter().setWidth(0, 0, "5");
		grid.getCellFormatter().setWidth(0, 1, "200");
		grid.getCellFormatter().setWidth(0, 2, "150");
		grid.getCellFormatter().setWidth(0, 3, "150");
		grid.getCellFormatter().setWidth(0, 4, "195");
	}

	private ReservaHotelTO getReserva(int row) {
		ReservaHotelTO reserva = (ReservaHotelTO) reservas.get(row - 1);
		return reserva;
	}

	private void iniciaTabela(String[] nomesColunas) {
		// somar +1 no nro de linhas para o cabecalho
		grid.resize(nroRegistrosPagina + 1, nomesColunas.length);

		for (int i = 0; i < nomesColunas.length; i++) {
			grid.setText(0, i, nomesColunas[i]);
		}
	}

	private void marcarLinha(int row) {

		// desmarca ultima linha selecionada e marca a atual
		if (this.linhaSelecionada > 0) {
			grid.getRowFormatter().setStyleName(this.linhaSelecionada,
					"travelsmart-table-linha");
		}

		// registra a linha selecionada
		this.linhaSelecionada = row;

		grid.getRowFormatter().setStyleName(row,
				"travelsmart-table-linhaSelecionada");
	}

	@Override
	public void update(List<ReservaHotelTO> arg) {
		exec((List) arg);
	}

}
